{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Batch Normalization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ../data/train-images-idx3-ubyte.gz\n",
      "Extracting ../data/train-labels-idx1-ubyte.gz\n",
      "Extracting ../data/t10k-images-idx3-ubyte.gz\n",
      "Extracting ../data/t10k-labels-idx1-ubyte.gz\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"../data\", one_hot=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def dense(x, size):\n",
    "    return tf.layers.dense(x, size)\n",
    "\n",
    "\n",
    "def dense_batch_relu(x, size, phase, scope, use_bn):\n",
    "    with tf.variable_scope(scope):\n",
    "        hidden = tf.layers.dense(x, size)\n",
    "        if use_bn:\n",
    "            hidden = tf.layers.batch_normalization(hidden, training=phase)\n",
    "        return tf.nn.relu(hidden, 'relu')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用Batch Norm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(tf.float32, (None, 784), name='x')\n",
    "y = tf.placeholder(tf.float32, (None, 10), name='y')\n",
    "phase = tf.placeholder(tf.bool, name='phase')\n",
    "\n",
    "h1 = dense_batch_relu(x, 100, phase, 'layer1', True)\n",
    "h2 = dense_batch_relu(h1, 100, phase, 'layer2', True)\n",
    "logits = tf.layers.dense(h2, 10, name='logits')\n",
    "\n",
    "with tf.name_scope('accuracy'):\n",
    "    accuracy = tf.reduce_mean(tf.cast(\n",
    "            tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)),\n",
    "            'float32'))\n",
    "\n",
    "with tf.name_scope('loss'):\n",
    "    loss = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用Batch Norm训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.0, 0.40137705, 0.8998182, 0.3858707, 0.9018]\n",
      "[2.0, 0.2806317, 0.9247091, 0.27438384, 0.9254]\n",
      "[3.0, 0.22669865, 0.93874544, 0.22603792, 0.9381]\n",
      "[4.0, 0.19536221, 0.9470909, 0.19791147, 0.9447]\n",
      "[5.0, 0.1734483, 0.9527636, 0.17962256, 0.948]\n",
      "[6.0, 0.15571256, 0.95723635, 0.16360001, 0.9527]\n",
      "[7.0, 0.14160381, 0.9613091, 0.15172392, 0.9575]\n",
      "[8.0, 0.12988809, 0.9646364, 0.14286597, 0.9598]\n",
      "[9.0, 0.12024695, 0.9670909, 0.13339405, 0.9612]\n",
      "[10.0, 0.111391746, 0.96943635, 0.12736762, 0.963]\n",
      "[11.0, 0.10324777, 0.97163635, 0.12148499, 0.9647]\n",
      "[12.0, 0.09701563, 0.9738182, 0.11781232, 0.9665]\n",
      "[13.0, 0.090735845, 0.97545457, 0.11264336, 0.9676]\n",
      "[14.0, 0.08532423, 0.9768909, 0.10847037, 0.9688]\n",
      "[15.0, 0.08128813, 0.97825456, 0.10744117, 0.9691]\n",
      "[16.0, 0.07693244, 0.9789818, 0.10325988, 0.9695]\n",
      "[17.0, 0.07256918, 0.9807818, 0.09992581, 0.9713]\n",
      "[18.0, 0.06882917, 0.9823818, 0.09901622, 0.9712]\n",
      "[19.0, 0.06508247, 0.9831273, 0.096344106, 0.9718]\n",
      "[20.0, 0.06166885, 0.9845818, 0.094008885, 0.9728]\n",
      "[21.0, 0.059294075, 0.9847818, 0.092606045, 0.9726]\n",
      "[22.0, 0.056234784, 0.9860182, 0.09050952, 0.9746]\n",
      "[23.0, 0.053613964, 0.9866, 0.088650785, 0.9744]\n",
      "[24.0, 0.050875645, 0.98776364, 0.08818456, 0.974]\n",
      "[25.0, 0.048421998, 0.98825455, 0.087033175, 0.9751]\n",
      "[26.0, 0.04644514, 0.98874545, 0.08625168, 0.9732]\n",
      "[27.0, 0.04432218, 0.9894, 0.08438251, 0.9752]\n",
      "[28.0, 0.042384066, 0.9900182, 0.0846088, 0.9747]\n",
      "[29.0, 0.04040006, 0.99045455, 0.08284884, 0.9764]\n",
      "[30.0, 0.039155044, 0.9908909, 0.08200702, 0.9754]\n",
      "[31.0, 0.03744067, 0.99169093, 0.08112284, 0.9757]\n",
      "[32.0, 0.03547296, 0.9922, 0.08074789, 0.9754]\n",
      "[33.0, 0.03420152, 0.9921091, 0.0796723, 0.9764]\n",
      "[34.0, 0.032723848, 0.99276364, 0.080303185, 0.9762]\n",
      "[35.0, 0.031101301, 0.9936909, 0.0793122, 0.9761]\n",
      "[36.0, 0.03021397, 0.99381816, 0.07924934, 0.9764]\n",
      "[37.0, 0.029077664, 0.9939455, 0.07932489, 0.977]\n",
      "[38.0, 0.027500555, 0.99432725, 0.07813549, 0.9773]\n",
      "[39.0, 0.026743742, 0.9946, 0.07821513, 0.9764]\n",
      "[40.0, 0.025522867, 0.99529094, 0.07791643, 0.9772]\n",
      "[41.0, 0.024822636, 0.9951091, 0.07834478, 0.9777]\n",
      "[42.0, 0.023847448, 0.9954727, 0.077726915, 0.9773]\n",
      "[43.0, 0.022656338, 0.99587274, 0.07776288, 0.9774]\n",
      "[44.0, 0.021722628, 0.9964, 0.0780785, 0.9768]\n",
      "[45.0, 0.021229235, 0.9963273, 0.07791906, 0.9781]\n",
      "[46.0, 0.020061193, 0.9967091, 0.07761081, 0.9774]\n",
      "[47.0, 0.019409662, 0.99667275, 0.07730619, 0.9771]\n",
      "[48.0, 0.018721987, 0.99694544, 0.0766822, 0.9779]\n",
      "[49.0, 0.018085947, 0.99741817, 0.077618696, 0.9772]\n",
      "[50.0, 0.017324721, 0.9974909, 0.07718485, 0.9772]\n"
     ]
    }
   ],
   "source": [
    "def train():\n",
    "    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)\n",
    "    with tf.control_dependencies(update_ops):\n",
    "        train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss)\n",
    "    sess = tf.Session()\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    history = []\n",
    "    iterep = 500\n",
    "    for i in range(iterep * 50):\n",
    "        x_train, y_train = mnist.train.next_batch(100)\n",
    "        sess.run(train_step,\n",
    "                 feed_dict={x: x_train,\n",
    "                            y: y_train,\n",
    "                            phase: True})\n",
    "        if (i + 1) % iterep == 0:\n",
    "            epoch = (i + 1) / iterep\n",
    "            tr = sess.run([loss, accuracy],\n",
    "                          feed_dict={x: mnist.train.images,\n",
    "                                     y: mnist.train.labels,\n",
    "                                     phase: False})\n",
    "            t = sess.run([loss, accuracy],\n",
    "                         feed_dict={x: mnist.test.images,\n",
    "                                    y: mnist.test.labels,\n",
    "                                    phase: False})\n",
    "            history += [[epoch] + tr + t]\n",
    "            print(history[-1])\n",
    "    sess.close()\n",
    "    return history\n",
    "\n",
    "\n",
    "history1 = train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 不使用batch norm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.0, 0.6498414, 0.8379273, 0.6246234, 0.8489]\n",
      "[2.0, 0.43222865, 0.8804727, 0.41078734, 0.8882]\n",
      "[3.0, 0.3671055, 0.8951273, 0.34911644, 0.9022]\n",
      "[4.0, 0.32889432, 0.90721816, 0.31370074, 0.9103]\n",
      "[5.0, 0.3034223, 0.91385454, 0.28935385, 0.9169]\n",
      "[6.0, 0.2855278, 0.91843635, 0.27207676, 0.9215]\n",
      "[7.0, 0.2695909, 0.9225818, 0.25709072, 0.9254]\n",
      "[8.0, 0.25538233, 0.9270727, 0.24466424, 0.9302]\n",
      "[9.0, 0.2438283, 0.9296727, 0.23418146, 0.9339]\n",
      "[10.0, 0.23258966, 0.93389094, 0.22460076, 0.9352]\n",
      "[11.0, 0.22340472, 0.9361454, 0.21660376, 0.9372]\n",
      "[12.0, 0.2143105, 0.9386182, 0.20947392, 0.9394]\n",
      "[13.0, 0.20672713, 0.9407273, 0.20161308, 0.9415]\n",
      "[14.0, 0.19838502, 0.94363636, 0.19403644, 0.9437]\n",
      "[15.0, 0.19125257, 0.9449818, 0.18751569, 0.9457]\n",
      "[16.0, 0.18384531, 0.9480364, 0.18150459, 0.9471]\n",
      "[17.0, 0.17833501, 0.9484909, 0.17681935, 0.9478]\n",
      "[18.0, 0.17220014, 0.9506909, 0.1730573, 0.9494]\n",
      "[19.0, 0.1671192, 0.9524, 0.16807269, 0.952]\n",
      "[20.0, 0.16268423, 0.95378184, 0.16479978, 0.9517]\n",
      "[21.0, 0.15668821, 0.95558184, 0.15939397, 0.9541]\n",
      "[22.0, 0.15239759, 0.9565091, 0.15604559, 0.9542]\n",
      "[23.0, 0.14951956, 0.95745456, 0.15448035, 0.9538]\n",
      "[24.0, 0.1439344, 0.9588909, 0.14841595, 0.9567]\n",
      "[25.0, 0.14061469, 0.95967275, 0.14576955, 0.9582]\n",
      "[26.0, 0.13693748, 0.9607091, 0.14345847, 0.958]\n",
      "[27.0, 0.13360305, 0.9624, 0.14100137, 0.9591]\n",
      "[28.0, 0.13100018, 0.96272725, 0.13994455, 0.9584]\n",
      "[29.0, 0.12800694, 0.9637273, 0.13756429, 0.9599]\n",
      "[30.0, 0.12373543, 0.9650364, 0.13335747, 0.9617]\n",
      "[31.0, 0.12244027, 0.9652727, 0.13181493, 0.9617]\n",
      "[32.0, 0.118639834, 0.9664364, 0.12876287, 0.9616]\n",
      "[33.0, 0.11624414, 0.9670909, 0.1276215, 0.9625]\n",
      "[34.0, 0.11401644, 0.96761817, 0.12630014, 0.9632]\n",
      "[35.0, 0.11178503, 0.96836364, 0.12411549, 0.9644]\n",
      "[36.0, 0.10828544, 0.9696909, 0.12127647, 0.9633]\n",
      "[37.0, 0.10647857, 0.96992725, 0.12015444, 0.9644]\n",
      "[38.0, 0.10381081, 0.9704, 0.117238194, 0.9649]\n",
      "[39.0, 0.10189217, 0.9713455, 0.1172044, 0.9649]\n",
      "[40.0, 0.10078704, 0.9710364, 0.11567227, 0.9659]\n",
      "[41.0, 0.09808656, 0.9726727, 0.114025414, 0.966]\n",
      "[42.0, 0.09661785, 0.9728, 0.1135458, 0.9664]\n",
      "[43.0, 0.094666965, 0.9732909, 0.11221923, 0.967]\n",
      "[44.0, 0.09484049, 0.97327274, 0.11244331, 0.9674]\n",
      "[45.0, 0.09080352, 0.97416365, 0.108714916, 0.9678]\n",
      "[46.0, 0.08964007, 0.9748, 0.109364994, 0.9669]\n",
      "[47.0, 0.088291906, 0.97507274, 0.10822207, 0.968]\n",
      "[48.0, 0.086029924, 0.97556365, 0.10613882, 0.9682]\n",
      "[49.0, 0.08466407, 0.9758545, 0.10509614, 0.9684]\n",
      "[50.0, 0.08315334, 0.9765091, 0.10408143, 0.9686]\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "x = tf.placeholder(tf.float32, (None, 784), name='x')\n",
    "y = tf.placeholder(tf.float32, (None, 10), name='y')\n",
    "phase = tf.placeholder(tf.bool, name='phase')\n",
    "\n",
    "h1 = dense_batch_relu(x, 100, phase, 'layer1', False)\n",
    "h2 = dense_batch_relu(h1, 100, phase, 'layer2', False)\n",
    "logits = tf.layers.dense(h2, 10, name='logits')\n",
    "\n",
    "with tf.name_scope('accuracy'):\n",
    "    accuracy = tf.reduce_mean(tf.cast(\n",
    "            tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1)),\n",
    "            'float32'))\n",
    "\n",
    "with tf.name_scope('loss'):\n",
    "    loss = tf.reduce_mean(\n",
    "        tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y))\n",
    "    \n",
    "    \n",
    "\n",
    "history2 = train()\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 绘图比较"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Populating the interactive namespace from numpy and matplotlib\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7ff8e6932630>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%pylab inline\n",
    "history_bn = np.array(history1)\n",
    "history = np.array(history2)\n",
    " \n",
    "plt.plot(history[:, 0], history[:, -1], label='t_acc')\n",
    "plt.plot(history_bn[:, 0], history_bn[:, -1], label='t_acc_bn') \n",
    "plt.legend()\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py3.6-env",
   "language": "python",
   "name": "py3.6-env"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
